/**
 * @file EcomCustomerRemote.java
 * Projet eCOM 2010 (Miage Descartes)
 * @author Doido Sébastien
 * @version 2
 * @brief Interface du bean dédié aux opérations réalisables par le client
 */
package ecom.beans;

import ecom.beans.CartBean.CartState;
import ecom.beans.EuroConvertorBean.Currency;
import java.util.Collection;
import java.util.Vector;

/**
 * @brief Opérations réalisables pour le bean interface 'client'
 * @author Doido Sébastien
 */
public interface EcomCustomerRemote {

    // Cart management
    /**
     * @brief Ajout d'un produit dans le panier
     * @param productId : produit souhaité
     * @param productStoreId : magasin fournissant le produit
     * @param quantity : quantité commandée
     * @throws ecom.beans.UnknownIdentifier : produit|magasin inexistant
     * @throws ecom.beans.CartException : erreur de panier
     */
    public void addProductToCart(int productId, int productStoreId, int quantity) throws UnknownIdentifier, CartException;

    /**
     * @brief Supprime un produit du panier
     * @param productId : produit à supprimer
     * @param productStoreId : magasin fournissant le produit
     * @param quantity : quantité à retirer du panier
     * @throws ecom.beans.UnknownIdentifier : produit|magasin inexistant
     * @throws ecom.beans.CartException : erreur panier
     */
    public void removeProductInCart(int productId, int productStoreId, int quantity) throws UnknownIdentifier, CartException;

    /**
     * @brief Renvoie les ligne s de commande du panier
     * @return les ligne s de commande du panier
     */
    public Collection<CartLine> getProductsInCart();

    /**
     * @brief Achat du panier pour un compte client
     * @param accountId : référence du compte payeur
     * @throws ecom.beans.UnknownIdentifier : compte inexistant
     * @throws ecom.beans.CartException : erreur panier
     * @return montant total du panier
     */
    public double buyCart(int accountId) throws UnknownIdentifier, CartException;

    /**
     * @brief Renvoie le montant total du panier
     * @return le montant total du panier
     */
    public double getCartTotalPrice();

    /**
     * @brief Renvoie l'état du panier
     * @return l'état du panier
     */
    public CartState getCartState();

    // Account Management
    /**
     * @brief Depot d'argent sur un compte client
     * @param accountId : compte à créditer
     * @param amount : montant à déposer
     * @throws ecom.beans.UnknownIdentifier : compte inexistant
     */
    public void deposit(int accountId, double amount) throws UnknownIdentifier;

    // Currency
    /**
     * @brief Renvoie une devise monétaire pour un code devise donné
     * @param valueOf : code devise
     * @return une devise monétise pour un code devise donné
     * @throws java.lang.Exception : code devise inexistant
     */
    public Currency getCurrencyByName(String valueOf) throws Exception;

    /**
     * @brief Renvoie le nom complet d'une devise
     * @param currencySymbol : symbole devise
     * @return  le nom complet d'une devise
     * @throws java.lang.Exception : devise inconnue
     */
	public String getCurrencyRealName(String valueOf) throws Exception;

    /**
     * @brief renvoie la liste des devises connues
     * @return la liste des devises connues
     */
	public Vector<String> getCurrencySymbols();

    /**
     * @brief Convertit un montant en euro vers un montant de devise X
     * @param amount : montant à couvertir
     * @param currencySymbol : devise de destination
     * @return
     */
    public double convertFromEuro(double amount, String currencySymbol);

    /**
     * @brief Convertit un montant d'une devise vers un montant en euro
     * @param amount : montant à convertir
     * @param currencySymbol : devise d'origine
     * @return le montant converti
     */
	public double convertToEuro(double amount, String currencySymbol);

    // Common Functions
    /**
     * @brief Renvoie un compte pour un ID donné
     * @param id : numéro du compte demandé
     * @return le compte associé à l'id demandé
     * @throws ecom.beans.UnknownIdentifier : id inexistant
     */
    public AccountBean getAccountById(int idAccount) throws UnknownIdentifier;

    /**
     * @brief Renvoie un compte pour un couple login/pass donné
     * @param login : identifiant à vérifier
     * @param pass : pass associé à l'identifiant
     * @return le compte associé au couple login/pass
     */
    public AccountBean getAccountByCredential(String login, String pass);

    /**
     * @brief Creation d'un compte acheteur/magasin
     * @param accountOwner : nom du propriétaire
     * @param balance : solde du compte
     * @param login : login pour l'accès aux opérations de gestion du compte
     * @param pass : mot de passe
     * @param surname : prénom du propriétaire
     * @param address : adresse du propriétaire
     * @param birthdate : date de naissance du propriétaire
     * @return l'identifiant affecté au compte
     */
    public int createAccount(String accountOwner, double balance, String login, String pass, String surname, String address, String birthdate);

    
    /**
     * @brief Mise à jour d'un compte acheteur/magasin
     * @param accountId : id du compte à modifier
     * @param accountOwner : nom du propriétaire
     * @param balance : solde du compte
     * @param login : login pour l'accès aux opérations de gestion du compte
     * @param pass : mot de passe
     * @param surname : prénom du propriétaire
     * @param address : adresse du propriétaire
     * @param birthdate : date de naissance du propriétaire
     * @throws ecom.beans.UnknownIdentifier : exception levée lorsque compte inexistant
     */
    public void updateAccount(int accountId, String accountOwner, double balance, String login, String pass, String surname, String address, String birthdate) throws UnknownIdentifier;
    
    /**
     * @brief Renvoie tous les produits connus
     * @return tous les produits connus
     */
    public Collection<ProductBean> getProducts();

    /**
     * @brief Renvoie un produit pour un id donné
     * @param idProduct : id demandé
     * @return un produit pour un id donné
     * @throws ecom.beans.UnknownIdentifier : référence produit inexistante
     */
    public ProductBean getProductById(int idProduct) throws UnknownIdentifier;

    /**
     * @brief renvoie tous les magasins connus
     * @return tous les magasins connus
     */
    public Collection<ProductStoreBean> getStores();

    /**
     * @brief Renvoie un magasin  pour un id donné
     * @param id : id demandé
     * @return un magasin  pour un id donné
     * @throws ecom.beans.UnknownIdentifier : : référence magasin inexistante
     */
    public ProductStoreBean getStoreById(int id) throws UnknownIdentifier;

    /**
     * @brief Renvoie toutes les catégories connues
     * @return toutes les catégories connues
     */
    public Collection<CategoryBean> getCategories();

    /**
     * @brief Renvoie une catégorie  pour un id donné
     * @param id : id demandé
     * @return une catégorie  pour un id donné
     * @throws ecom.beans.UnknownIdentifier : référence catégorie inexistante
     */
    public CategoryBean getCategoryById(int id) throws UnknownIdentifier;

    /**
     * @brief Renvoie toutes les lignes d'inventaire connues
     * @return toutes les lignes d'inventaire connues
     */
    public Collection<WarehouseLineBean> getStocks();

    /**
     * @brief Renvoie toutes les lignes d'inventaire relatives à un magasin
     * @param productStoreId : référence magasin
     * @return toutes les lignes d'inventaire relatives à un magasin
     * @throws ecom.beans.UnknownIdentifier : id magasin inexistant
     */
    public Collection<WarehouseLineBean> getProductsInStore(int productStoreId) throws UnknownIdentifier;

    /**
     * @brief Renvoie toutes les lignes d'inventaire relatives à un produit
     * @param productId : référence produit
     * @return toutes les lignes d'inventaire relatives à un produit
     * @throws ecom.beans.UnknownIdentifier : id produi inexistant
     */
    public Collection<WarehouseLineBean> getProductsByProductId(int productId) throws UnknownIdentifier;

    /**
     * @brief Renvoie toutes les lignes d'inventaire relatives à un produit dont le nom est 'name'
     * @param name : nom du produit recherché
     * @return toutes les lignes d'inventaire relatives à un produit dont le nom est 'name'
     */
    public Collection<WarehouseLineBean> getProductsByName(String name);

    /**
     * @brief Renvoie toutes les lignes d'inventaire relatives à un produit dont le nom similaire à 'name'
     * @param name : critère de similitude
     * @return toutes les lignes d'inventaire relatives à un produit dont le nom similaire à 'name'
     */
    public Collection<WarehouseLineBean> getProductsBySimilarName(String name);

    /**
     * @brief Renvoie toutes les lignes d'inventaire pour un prix de vente compris entre 'min' et 'max'
     * @param min : prix min (eur)
     * @param max : prix max (eur)
     * @return  toutes les lignes d'inventaire pour un prix de vente compris entre 'min' et 'max'
     */
    public Collection<WarehouseLineBean> getProductsByPriceInterval(double min, double max);

    /**
     * @brief Renvoie toutes les lignes d'inventaire pour un prix de vente < 'max'
     * @param max : prix max (eur)
     * @return  toutes les lignes d'inventaire pour un prix de vente < 'max'
     */
    public Collection<WarehouseLineBean> getProductsByByMaximumPrice(double max);

    /**
     * @brief Renvoie toutes les lignes d'inventaire pour un produit de catégorie 'idCateg'
     * @param idCateg : référence catégorie
     * @return toutes les lignes d'inventaire pour un produit de catégorie 'idCateg'
     * @throws ecom.beans.UnknownIdentifier : catégorie inexistante
     */
    public Collection<WarehouseLineBean> getProductsByCategory(int idCateg) throws UnknownIdentifier;

    /**
     * @brief Suppression de produits (quantité) d'une ligne de stock
     * @param productStoreId : magasin vendant le produit
     * @param productId : produit vendu
     * @param quantity : quantité à supprimer
     * @throws ecom.beans.UnknownIdentifier : magasin ou produit inconnu
     * @throws java.lang.Exception : erreur de suppression (quantité >max)
     */
    public void removeStockLine(int productStoreId, int productId, int quantity) throws UnknownIdentifier, Exception;    
}